home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 4
/
Aminet 4 - November 1994.iso
/
aminet
/
comm
/
term
/
term41source.lha
/
Extras
/
Source
/
gtlayout-Source.lha
/
LibCode.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-08-01
|
4KB
|
194 lines
#define LIB_CODE 1
#include "gtlayout.h"
#include <dos/dos.h>
#include <exec/execbase.h>
#include <exec/libraries.h>
#include <clib/exec_protos.h>
#include <pragmas/exec_pragmas.h>
#include <clib/alib_protos.h>
STATIC struct Library * __asm __saveds LibInit(register __a0 BPTR Segment,register __d0 struct Library *Base);
STATIC struct Library * __asm __saveds LibOpen(register __a6 struct Library *Base);
STATIC BPTR __asm __saveds LibExpunge(register __a6 struct Library *Base);
STATIC BPTR __asm __saveds LibClose(register __a6 struct Library *Base);
STATIC LONG __asm __saveds LibNull(register __a6 struct Library *Base);
extern __far struct Resident RomTag;
STATIC APTR LibVectors[] =
{
LibOpen,
LibClose,
LibExpunge,
LibNull,
LT_LevelWidth,
LT_DeleteHandle,
LT_CreateHandle,
LT_CreateHandleTagList,
LT_Rebuild,
LT_HandleInput,
LT_BeginRefresh,
LT_EndRefresh,
LT_GetAttributesA,
LT_SetAttributesA,
LT_AddA,
LT_NewA,
LT_EndGroup,
LT_LayoutA,
LT_LayoutMenusA,
LT_Fixed2String,
LT_String2Fixed,
LT_FixedMult,
LT_LabelWidth,
LT_LabelChars,
LT_LockWindow,
LT_UnlockWindow,
LT_DeleteWindowLock,
LT_ShowWindow,
LT_Activate,
LT_PressButton,
LT_GetCode,
LT_GetIMsg,
LT_ReplyIMsg,
(APTR)-1
};
STATIC struct ExecBase *SysBase;
STATIC struct SignalSemaphore LockSemaphore;
struct Library *UtilityBase;
extern UBYTE __far LibName[],LibID[];
extern LONG __far LibVersion,LibRevision;
struct { ULONG DataSize; APTR Table; APTR Data; struct Library * (*Init)(); } __aligned LibInitTab =
{
sizeof(struct Library),
LibVectors,
NULL,
LibInit
};
STATIC BPTR LibSegment;
STATIC struct Library * __asm __saveds
LibInit(register __a0 BPTR Segment,register __d0 struct Library *Base)
{
Base -> lib_Node . ln_Type = NT_LIBRARY;
Base -> lib_Node . ln_Name = LibName;
Base -> lib_Flags = LIBF_CHANGED | LIBF_SUMUSED;
Base -> lib_Version = LibVersion;
Base -> lib_Revision = LibRevision;
Base -> lib_IdString = (APTR)LibID;
LibSegment = Segment;
SysBase = *(struct ExecBase **)4;
InitSemaphore(&LockSemaphore);
#ifdef CPU_ANY
if(SysBase -> LibNode . lib_Version < 37)
#else
if(SysBase -> LibNode . lib_Version < 37 || !(SysBase -> AttnFlags & AFF_68020))
#endif /* CPU_ANY */
return(NULL);
else
return(Base);
}
STATIC struct Library * __asm __saveds
LibOpen(register __a6 struct Library *Base)
{
Base -> lib_Flags &= ~LIBF_DELEXP;
Base -> lib_OpenCnt++;
if(Base -> lib_OpenCnt == 1)
{
ObtainSemaphore(&LockSemaphore);
if(UtilityBase = OpenLibrary("utility.library",0))
{
if(LT_Init())
{
ReleaseSemaphore(&LockSemaphore);
return(Base);
}
LT_Exit();
CloseLibrary(UtilityBase);
UtilityBase = NULL;
}
ReleaseSemaphore(&LockSemaphore);
return(NULL);
}
else
return(Base);
}
STATIC BPTR __asm __saveds
LibExpunge(register __a6 struct Library *Base)
{
if(!Base -> lib_OpenCnt && LibSegment)
{
BPTR TempSegment = LibSegment;
Remove((struct Node *)Base);
FreeMem((BYTE *)Base - Base -> lib_NegSize,Base -> lib_NegSize + Base -> lib_PosSize);
LibSegment = NULL;
return(TempSegment);
}
else
{
Base -> lib_Flags &= ~LIBF_DELEXP;
return(NULL);
}
}
STATIC BPTR __asm __saveds
LibClose(register __a6 struct Library *Base)
{
Base -> lib_OpenCnt--;
if(!Base -> lib_OpenCnt)
{
ObtainSemaphore(&LockSemaphore);
LT_Exit();
CloseLibrary(UtilityBase);
UtilityBase = NULL;
ReleaseSemaphore(&LockSemaphore);
if(Base -> lib_Flags & LIBF_DELEXP)
return(LibExpunge(Base));
}
return(NULL);
}
STATIC LONG __asm __saveds
LibNull(register __a6 struct Library *Base)
{
return(NULL);
}